みなさんへの告知板


オンラインゲームからは離れました。これからはリアルょぅι゛ょで頑張ろうと思います


ミジンコゼミナール


ネットゲーム解析初心者向け講座、ミジンコゼミナール 開講!

多重起動、窓化の基礎をしらんやつは見ておけ。
読んでも理解できないやつは解析以前の問題だから文句いうな('A`)

ミジンコゼミナール:ネットゲーム解析講座一覧
1日目:入学/必要な教材 2日目:基本的なアセンブリ言語
3日目:Ollydbg の操作方法と演習 4日目:多重起動1(FindWindow)
5日目:多重起動2(CreateMutex) 6日目:多重起動3(EnumWindows、その他の方法)
7日目:ウィンドウについて
8日目:窓化(D8) 9日目:窓化(D9)
10日目:DLL について 11日目:何か作ってみよう
12日目:試験 13日目:プレゼント

2005年09月09日


Astec-○

システム管理に携わる業務をする者にとっては有益なソフト。

このソフト、ある日数まで使用可能というよくあるタイプの体験版がリリースされている。

そしてポイントは2点。

・規定した日付を越すと使用不可になる。
・ソフトがインストールされた日時がシステム(PC)の日時より先になると使用不可になる。



解析方法についてだが上述したようにいづれも時間というキーワードで繋がっている。

さっそく確認してみたところ GetLocalTime、GetSystemTime の API が確認できた。

以下に必要箇所の抜粋、注釈を記す。



まず 00401278GetLocalTime を見てみると現在時刻を取得し eax に転送し
その後の処理でそれぞれを比較しているのが確認できる。


00401277 |. 50 PUSH EAX ; /pLocaltime
00401278 |. FF15 6C635200 CALL DWORD PTR DS:[<&KERNEL32.GetLocalTi>; \GetLocalTime
0040127E |. 8B4424 00 MOV EAX,DWORD PTR SS:[ESP]
00401282 |. 8B4C24 02 MOV ECX,DWORD PTR SS:[ESP+2]
00401286 |. 25 FFFF0000 AND EAX,0FFFF
0040128B |. 81E1 FFFF0000 AND ECX,0FFFF
00401291 |. 3BC6 CMP EAX,ESI
⇒ 現在の年(EAX)と ECX(2004)を比較

00401293 |. 7F 20 JG SHORT コピー_・004012B5   
⇒ EAX と ECXが等しくなければ jmp

00401295 |. 75 18 JNZ SHORT コピー_・004012AF
00401297 |. 3BCF CMP ECX,EDI
⇒ 現在の月と EDI(10)を比較

00401299 |. 7F 1A JG SHORT コピー_・004012B5
0040129B |. 75 12 JNZ SHORT コピー_・004012AF
0040129D |. 8B4C24 06 MOV ECX,DWORD PTR SS:[ESP+6]
004012A1 |. 8B4424 14 MOV EAX,DWORD PTR SS:[ESP+14] 
004012A5 |. 81E1 FFFF0000 AND ECX,0FFFF         
004012AB |. 3BC8 CMP ECX,EAX
⇒ 現在の日付(ECX)と EAX(31) を比較。

004012AD |. 7F 06 JG SHORT コピー_・004012B5
⇒ EAX と ECX が等しくなければ jmp をしルーチン終了。



まず最初に行うべきことは 年を比較している 00401291 のCMP 命令の
チェックを外すことだ。
現在時刻同士で比較するように変えておく。

  > CMP EAX,EAX


次は月を比較する 00401297 の CMP 命令、ここは チェックタイムである
ECX 同士で比較でもさせておこう

> CMP ECX,ECX


最後は日付を比較する 004012AB の CMP 命令だ。
実際にはここを替える必要はないかもしれないが念のため現在日付同士で比較させておく。

> CMP EAX,EAX


一見するとこれで書き換え終了に見えるのだが、このまま実行しても期限切れの MessageBox
が出てきてしまう。

そう、これはまだ一つ目のポイントなのだ。

> ・規定した日付を越すと使用不可になる。
> ・ソフトがインストールされた日時がシステム(PC)の日時より先になると使用不可になる。

残る一つのチェックルーチンについてだが、今度はソフトがインストールされた時間と PC の持つ
時間との比較だ。

この比較には SystemTimeToFileTime、GetLocalTime が使われている。

004017B0 /$ 83EC 20 SUB ESP,20
004017B3 |. 8D4424 10 LEA EAX,DWORD PTR SS:[ESP+10]
004017B7 |. 56 PUSH ESI
004017B8 |. 50 PUSH EAX ; /pLocaltime
004017B9 |. FF15 6C635200 CALL DWORD PTR DS:[<&KERNEL32.GetLocalTi>; \GetLocalTime
⇒ システム時刻を取得

004017BF |. 8B35 5C635200 MOV ESI,DWORD PTR DS:[<&KERNEL32.SystemT>; KERNEL32.SystemTimeToFileTime
⇒ ESI へ SystemTimeToFileTime のアドレスをセット

004017C5 |. 8D4C24 04 LEA ECX,DWORD PTR SS:[ESP+4]
004017C9 |. 51 PUSH ECX ; /pFileTime  
004017CA |. 68 40005300 PUSH .00530040 ; |pSystemTime = _.00530040
004017CF |. FFD6 CALL ESI ; \SystemTimeToFileTime
⇒ ESI に入っているアドレスから SystemTimeToFileTime を取り出し

004017D1 |. 8D5424 0C LEA EDX,DWORD PTR SS:[ESP+C]
システム時刻を取得

004017D5 |. 8D4424 14 LEA EAX,DWORD PTR SS:[ESP+14]
004017D9 |. 52 PUSH EDX ; /pFileTime 
004017DA |. 50 PUSH EAX ; |pSystemTime
004017DB |. FFD6 CALL ESI ; \SystemTimeToFileTime
⇒ ファイル時刻を取得

004017DD |. 8D4C24 04 LEA ECX,DWORD PTR SS:[ESP+4]
⇒ 取得したシステム時刻をセット

004017E1 |. 8D5424 0C LEA EDX,DWORD PTR SS:[ESP+C]
⇒ 取得したファイル時刻をセット

004017E5 |. 51 PUSH ECX ; /pFileTime2
004017E6 |. 52 PUSH EDX ; |pFileTime1
004017E7 |. FF15 60635200 CALL DWORD PTR DS:[<&KERNEL32.CompareFil>; \CompareFileTime  
⇒ セットしたシステム時刻とファイル時刻を比較

004017ED |. 33C9 XOR ECX,ECX
004017EF |. 5E POP ESI
004017F0 85C0 TEST EAX,EAX
004017F2 0F9FC1 SETG CL
004017F5 8BC1 MOV EAX,ECX
004017F7 83C4 20 ADD ESP,20
004017FA \. C3 RETN


上記の内容から一つ目の SystemTimeToFileTime へシステム時刻をセットし
そして 2つ目の SystemTimeToFileTime すなわちファイル時刻との比較を
しているのが確認できる。

さて、ここで書き換える箇所としては時間を取得している箇所か?いや違うな。

システムとファイル生成日時を比較している CompareFileTime の API を書き換えればいい。

具体的には・・・・というよりも 004017E5 の PUSH ECX をEDX へ変更するだけだ、これで比較対照
は自分自身となる
そして比較結果としてゼロ以外は返らないため、時刻による判定はいつも真になり10年後に起動しても
無事に立ち上がってくれるというわけだ。



■判定式
CompareFileTime によりシステム日時とファイル日時を比較
・ファイル日時のほうが進んでいる -> 試用期間終了のメッセージへ
・システム日時のほうが進んでいる、もしくはファイル日時と同一の場合
-> 2004/10/31 とシステム日時との比較へ

GetLocalTime により 2004/10/31 とシステム日時を比較
・システム日時のほうが進んでいる -> 試用期間終了のメッセージへ
・システム日時が 2004/10/31 以前 -> 試用期間内と判定しソフトを起動


■バイナリ修正
+--------+------+
| offset | data |
+--------+------+
| 1291 | 3BC0 |
+--------+------+
| 1297 | 3BC9 |
+--------+------+
| 12AB | 3BC0 |
+--------+------+
| 17E5 | 52 |
+--------+------+


PS:ちなみに去年に解析したネタなので、日付の比較が 2004(年) になってます…orz
今年の体験版なら 2005 になってるのかな?w


この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:


この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。